Repository navigation
Conversation
…hness Three metrics of a one-channel SignalObj in Pa, each returning a dict of floats and NumPy arrays: - loudness_zwicker: ISO 532-1:2017, stationary and time-varying methods, free or diffuse field. N (sone), LN (phon), the specific loudness over 240 steps of 0.1 Bark and, time-varying, N(t), LN(t) and N'(t) every 2 ms with Nmax and N5. Port of SQAT's Loudness_ISO532_1 (BSD-3, Ella Manor's AARAE code after the C code of the standard). Signals not at 48 kHz are resampled as MATLAB's resample does (matches it to 2e-15). - sharpness_din45692: DIN 45692:2009, Formula (1) on that specific loudness, k = 0.11; S, or S(t) and S50 for the time-varying method. Written from the standard. - roughness_daniel1997: Daniel and Weber (1997), R(t), R'(t) over 47 half-Bark channels and Rmean (asper). Port of SQAT's Roughness_Daniel1997 (MIT, Dik Hermes et al.). The BSD-3 and MIT notices of the ported files are in the module header. Validation. Against SQAT on golden data from tests/golden/make_loudness_sqat.m and make_roughness_sqat.m (MATLAB R2026b, same float32 samples): stationary loudness within 3e-13, time- varying within 3.1e-8 sone (the nonlinear decay amplifies 3e-14 of filter rounding on the decay of a burst), roughness within 2.8e-5 asper (FFT rounding, 32 kHz input). ISO 532-1 Annex B: signal 1 (band levels) 83.2957 sone against 83.296; the standard's files of signals 2 to 5 within 0.034 sone (0.26 %); signals 6 to 25 keep N(t) within 5 % or 0.1 sone at every frame, max deviation 0.068 sone. DIN 45692: the 41 test signals of Tables A.2 and A.3 within 0.45 of the tolerance (worst 10.5 kHz band, -0.19 acum), reference noise 1.02 acum. 1 kHz at 40 dB gives 0.999976 sone; the reference AM tone 1.000001 asper. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This was referenced Oct 31, 2026
Open
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds
pytta.psychoacousticswith three metrics of a one-channel SignalObj in Pa. Each returns a dict of floats and NumPy arrays, with the keys listed in the docstring.loudness_zwicker(signal, field='free', method='stationary', time_skip=0.0): ISO 532-1:2017, stationary and time-varying methods, free or diffuse field. It gives N (sone), LN (phon) and the specific loudness over 240 steps of 0.1 Bark. The time-varying method adds N(t), LN(t) and N'(t) every 2 ms, with Nmax and N5.sharpness_din45692(signal, field='free', method='stationary', time_skip=0.0): DIN 45692:2009, Formula (1), applied to that specific loudness with k = 0.11. It gives S, or S(t) and S50 for the time-varying method.roughness_daniel1997(signal, time_skip=0.0): the model of Daniel and Weber (1997). It gives R(t), R'(t) over 47 half-Bark channels and Rmean (asper).Regarding the origin of the code, loudness is a port of
Loudness_ISO532_1.mfrom SQAT (https://github.com/ggrecow/SQAT), which is BSD-3-Clause: code by Ella Manor for AARAE, after the C code of the standard. Roughness is a port ofRoughness_Daniel1997.mand its utilities, which are MIT: code by J. E. Schrader and Dik Hermes. Both notices are reproduced in the module header. No GPL file of SQAT was used. Sharpness is written from the text of DIN 45692. Signals not at 48 kHz are resampled the way MATLABresampledoes, which matches it to 2e-15.The tests in
tests/test_psychoacoustics.py(13 tests) synthesise their signals, so no file of the standards is needed:tests/golden/make_loudness_sqat.mandmake_roughness_sqat.m(MATLAB R2026b, same float32 samples). Stationary loudness agrees within 3e-13 sone, time-varying loudness within 3.1e-8 sone and roughness within 2.8e-5 asper.Outside the test suite, the code was also run on the signal files that come with the standards. ISO 532-1 signals 2 to 5 agree within 0.034 sone (0.26 %), and signals 6 to 25 keep N(t) within 5 % or 0.1 sone at every frame. All 41 signals of DIN 45692 Tables A.2 and A.3 fall within 0.45 of the tolerance, the worst being the 10.5 kHz band at -0.19 acum.
Checked with Python 3.12, numpy 1.26 and scipy 1.17. With NumPy 2 the tests fail in
SignalObjonnp.complex_, which #53 fixes.Co-Authored-By: Claude Fable 5.1 noreply@anthropic.com